package pruebaciudad;

import pruebaciudad.formas.Circulo;
import pruebaciudad.formas.Figura;
import pruebaciudad.formas.FiguraConCentro;
import pruebaciudad.formas.Imagen;
import pruebaciudad.formas.PoligonoRegular;
import pruebaciudad.formas.Punto;
import pruebaciudad.panels.PanelDeDibujo;
import pruebaciudad.panels.PanelTest;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.Random;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.Timer;
import javax.swing.UIManager;

public class PruebaCiudad {

  public static PanelTest gp;

    public static void main(String[] args) {
        init();
        gp.setMinimumSize(new Dimension(400, 200));
        //gp.setSize(new Dimension(760, 760));
        Figura f = PoligonoRegular.crearCuadrado( Punto.ORIGEN,800 , 45);
        f.setColorDeLinea(Color.BLACK);
        f.setColorDeRelleno(Color.GRAY);
//        f.setRellenar(true);
        
        int b=-280; //posicion en la que comienza en el eje x
                    //usado para el punto
        //int e=280; //posicion de y
        
        gp.dibujar(f);
        while(b<=320){
            
            Punto a =  new Punto(b,280);
            Figura cuadra = PoligonoRegular.crearCuadrado(a, 60, 45);
            Punto c =  new Punto(b,280);
            Figura cuadra2 = PoligonoRegular.crearCuadrado(c, 40, 45);
            cuadra.setColorDeLinea(Color.BLACK); //cuadrante de afuera
            cuadra.setColorDeRelleno(Color.GREEN);
            cuadra.setRellenar(true);
            cuadra2.setColorDeLinea(Color.BLACK);
            cuadra2.setColorDeRelleno(Color.LIGHT_GRAY);
            cuadra2.setRellenar(true);
            gp.dibujar(cuadra);
            gp.dibujar(cuadra2);
            
            Punto d =  new Punto(b,150);
            Figura cuadra3 = PoligonoRegular.crearCuadrado(d, 60, 45);
            Punto g =  new Punto(b,150);
            Figura cuadra4 = PoligonoRegular.crearCuadrado(g, 40, 45);
            cuadra3.setColorDeLinea(Color.BLACK);
            cuadra3.setColorDeRelleno(Color.GREEN);
            cuadra3.setRellenar(true);
            cuadra4.setColorDeLinea(Color.BLACK);
            cuadra4.setColorDeRelleno(Color.LIGHT_GRAY);
            cuadra4.setRellenar(true);
            gp.dibujar(cuadra3);
            gp.dibujar(cuadra4);
            
            Punto h =  new Punto(b,20);
            Figura cuadra5 = PoligonoRegular.crearCuadrado(h, 60, 45);
            Punto j =  new Punto(b,20);
            Figura cuadra6 = PoligonoRegular.crearCuadrado (j, 40, 45);
            cuadra5.setColorDeLinea(Color.BLACK);
            cuadra5.setColorDeRelleno(Color.GREEN);
            cuadra5.setRellenar(true);
            cuadra6.setColorDeLinea(Color.BLACK);
            cuadra6.setColorDeRelleno(Color.LIGHT_GRAY);
            cuadra6.setRellenar(true);
            gp.dibujar(cuadra5);
            gp.dibujar(cuadra6);
            
            Punto k =  new Punto(b,-110);
            Figura cuadra7 = PoligonoRegular.crearCuadrado(k, 60, 45);
            Punto l =  new Punto(b,-110);
            Figura cuadra8 = PoligonoRegular.crearCuadrado (l, 40, 45);
            cuadra7.setColorDeLinea(Color.BLACK);
            cuadra7.setColorDeRelleno(Color.GREEN);
            cuadra7.setRellenar(true);
            cuadra8.setColorDeLinea(Color.BLACK);
            cuadra8.setColorDeRelleno(Color.LIGHT_GRAY);
            cuadra8.setRellenar(true);
            gp.dibujar(cuadra7);
            gp.dibujar(cuadra8);
            
            Punto m =  new Punto(b,-240);
            Figura cuadra9 = PoligonoRegular.crearCuadrado(m, 60, 45);
            Punto n =  new Punto(b,-240);
            Figura cuadra10 = PoligonoRegular.crearCuadrado (n, 40, 45);
            cuadra9.setColorDeLinea(Color.BLACK);
            cuadra9.setColorDeRelleno(Color.GREEN);
            cuadra9.setRellenar(true);
            cuadra10.setColorDeLinea(Color.BLACK);
            cuadra10.setColorDeRelleno(Color.LIGHT_GRAY);
            cuadra10.setRellenar(true);
            gp.dibujar(cuadra9);
            gp.dibujar(cuadra10);
            
            b=b+150;      
        }
      
        
//        Circulo c = new Circulo(new Punto(12, 123), 40);
//        //Circulo c = new Circulo(Punto.ORIGEN, 50);
//        c.setRellenar(true);
//        c.setColorDeRelleno(Color.CYAN);
//        c.setColorDeLinea(Color.BLACK);
//        gp.dibujar(c);
//        new Movedor(c).start();
//        try {
//            Imagen i = new Imagen("carro.png", Punto.ORIGEN, 45, 45);
//            i.setMostrarPuntos(false);
//            i.setMostrarCentro(false);
            AutitoMovedo am = new AutitoMovedo();
            gp.dibujar(am.getImagenDeAutito());
            am.start();
//        } catch (IOException ex) {
//            ex.printStackTrace();
//        }
        new Pintador(gp.internalPanel).start();
    }

    private static void init() {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        
        JFrame frame = new JFrame("La Ciudad de las letras");
        frame.setJMenuBar(getMenu());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(900, 900); //tamaño de la ventana
        gp = new PanelTest(750, 750); //tamaño del panel de dibujo
        gp.internalPanel.setOrigen(Punto.ORIGEN);
        frame.add(gp);
    }
    private static JMenuItem salir = new JMenuItem("Salir");
    private static JMenuItem deshacer = new JMenuItem("Deshacer");
    private static JMenuItem rehacer = new JMenuItem("Rehacer");
    private static JCheckBoxMenuItem mostrarEjeX = new JCheckBoxMenuItem("Mostrar Eje X", true);
    private static JCheckBoxMenuItem mostrarEjeY = new JCheckBoxMenuItem("Mostrar Eje Y", true);
    private static JCheckBoxMenuItem mostrarBordes = new JCheckBoxMenuItem("Mostrar Bordes", true);
    private static JCheckBoxMenuItem mostrarCuadricula = new JCheckBoxMenuItem("Mostrar Cuadrícula", true);

    private static JMenuBar getMenu() {
        JMenuBar menu = new JMenuBar();
        JMenu m = new JMenu("Archivo");
        m.add(salir);
        menu.add(m);
        m = new JMenu("Ver");
        m.add(mostrarEjeX);
        m.add(mostrarEjeY);
        m.add(mostrarBordes);
        m.add(mostrarCuadricula);
        menu.add(m);
        m = new JMenu("Edición");
        m.add(deshacer);
        m.add(rehacer);
        menu.add(m);

        Acciones ac = new Acciones();
        salir.addActionListener(ac);
        rehacer.addActionListener(ac);
        deshacer.addActionListener(ac);
        mostrarEjeX.addActionListener(ac);
        mostrarEjeY.addActionListener(ac);
        mostrarBordes.addActionListener(ac);
        mostrarCuadricula.addActionListener(ac);
        return menu;
    }

    private static class Acciones implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == salir){
                System.exit(0);
            } else if (e.getSource() == rehacer){
                gp.internalPanel.rehacer();
            } else if (e.getSource() == deshacer){
                gp.internalPanel.deshacer();
            } else if (e.getSource() == mostrarEjeX){
                gp.internalPanel.setMostrarEjeX(mostrarEjeX.isSelected());
            } else if (e.getSource() == mostrarEjeY){
                gp.internalPanel.setMostrarEjeY(mostrarEjeY.isSelected());
            } else if (e.getSource() == mostrarBordes){
                gp.internalPanel.setMostrarBordes(mostrarBordes.isSelected());
            } else if (e.getSource() == mostrarCuadricula){
                gp.internalPanel.setMostrarCuadricula(mostrarCuadricula.isSelected());
            }
        }
    }
    
    private static class Movedor extends Timer implements ActionListener {
        private static final long serialVersionUID = 1L;
        private static final Random ALEATORIO = new Random();
            
        private Figura figura;
        
        public Movedor(Figura figura){
            super(500, null);
            this.figura = figura;
            addActionListener(this);
            setDelay(10);
        }
        
        int i, paso = ALEATORIO.nextInt(2) + 1;
        boolean vertical, derecha_arriba;
        
        @Override
        public void actionPerformed(ActionEvent e) {
            synchronized(ALEATORIO){
                if (++i > 50){
                    vertical = ALEATORIO.nextBoolean();
                    derecha_arriba = ALEATORIO.nextBoolean();
                    i = 0;
                }

                int x = (vertical ? 0 : 1 * (derecha_arriba ? 1 : -1)) * paso;
                int y = (vertical ? 1 * (derecha_arriba ? 1 : -1) : 0) * paso;

                if (figura instanceof FiguraConCentro){
                    FiguraConCentro fcc = (FiguraConCentro)figura;
                    if (Math.abs(fcc.getCentro().getX()) > 300 || Math.abs(fcc.getCentro().getY()) > 200){
                        fcc.setCentro(Punto.ORIGEN);
                    } else {
                        figura.desplazar(x, y);
                    }
                } else {
                    figura.desplazar(x, y);
                }
            }
        }
        
    }
    
    private static class Pintador extends Timer implements ActionListener {
        private static final long serialVersionUID = 1L;
            
        private PanelDeDibujo panel;
        
        public Pintador(PanelDeDibujo panel){
            super(500, null);
            this.panel = panel;
            addActionListener(this);
            setDelay(5);
        }
        
        @Override
        public void actionPerformed(ActionEvent e) {
            panel.repaint();
        }
        
    }
}
